// 集合   - heap堆上的数据，不用提前确定大小，可以随意变大变小，是动态的
// Vector  数组  只能存储同类型的数据，内存中是连续的
mod lll;

// HashMap 使用比较少，所以不存在prelude(预导入模块中)  同构的(所有数据都是需要相同结构的)
use std::collections::HashMap;

use lll::demo_for_string::string_contact;

#[derive(Debug)]
enum SpreadsheetCell {
    Int(i32),
    Float(f64),
    Text(String),
}

mod a {
    pub fn foo() {}
}
use a::foo;

// HashMap

fn main() {
    foo();
    let mut vc: Vec<i32> = Vec::new();
    let vc1 = vec![1, 2, 3];
    vc.push(1);

    // let vs_item = &vc1[100]; //100超出了vc1的索引范围，会引起panic  程序恐慌，进而直接终止程序
    // // 删除
    // println!("{}", vs_item);

    //这种方式不会引起恐慌

    match vc1.get(100) {
        Some(item) => println!("{}", item),
        None => println!("have no element!"),
    };

    // 遍历
    let mut vv = vec![23, 34, 98];
    for v in &mut vv {
        //解引用
        *v += 2;
    }

    for v in &vv {
        println!("vv:{}", v);
    }

    // 枚举集合
    let row: Vec<SpreadsheetCell> = vec![
        SpreadsheetCell::Int(10),
        SpreadsheetCell::Float(3.23),
        SpreadsheetCell::Text(String::from("wwqe")),
    ];
    println!("{:?}", row);
    string_contact();

    // HashMap
    let mut scores = HashMap::new();
    scores.insert(String::from("blue"), 12);
    scores.insert(String::from("yellow"), 24);
    // hashMap 和 所有权
    // 对于实现了copy trait 的类型(例如i32),z值会被复制到HashMap中
    // 对于拥有所有权的值  (例如String)，值会被移动，所有权会转移给HashMap

    // 遍历  后面还需要使用的话  使用借用
    for (k, v) in &scores {
        println!("{} : {}", k, v);
    }
    scores.insert(String::from("red"), 166);



    let text = "hello world wonderful world";

    let mut map = HashMap::new();

    for t in text.split_whitespace() {

        let mut count = map.entry(t).or_insert(0);

        *count += 1;

    };

    println!("{:?}",map);
}
